package br.com.sgmf.web.managedbean;

import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.com.sgmf.enums.StatusOS;
import br.com.sgmf.model.OrdemServico;
import br.com.sgmf.service.OrdemServicoService;

import com.lowagie.text.Document;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.PageSize;
import com.lowagie.text.Phrase;

@Component
@ManagedBean
@RequestScoped
public class RelatorioOrdemServicoBean {

	private static final String RELATORIO_DE_ORDENS_SERVICO = "Relatório de Ordens de Serviço";
	private static final String DATA_FIM_NAO_PODE_SER_MENOR_QUE_DATA_INICIO = "Data Fim não pode ser menor que Data Início";

	private Date inicio;
	private Date fim;
	private StatusOS statusOS;

	private List<OrdemServico> ordensServico;

	@Autowired
	private OrdemServicoService ordemServicoService;

	@PostConstruct
	public void inicializar() {
		ordensServico = null;
	}

	public List<OrdemServico> buscar() {
		if (inicio != null && fim != null && fim.before(inicio)) {
			FacesContext context = FacesContext.getCurrentInstance();
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN,
					DATA_FIM_NAO_PODE_SER_MENOR_QUE_DATA_INICIO, null);
			context.addMessage(null, message);
		} else {
			ordensServico = ordemServicoService.findBetweenDate(inicio, fim,
					statusOS);
		}
		return ordensServico;
	}

	public void preProcessPDF(Object document) {
		Document pdf = (Document) document;
		pdf.setPageSize(PageSize.A4.rotate());
		HeaderFooter header = new HeaderFooter(new Phrase(
				RELATORIO_DE_ORDENS_SERVICO), false);
		pdf.setHeader(header);
		pdf.open();
	}

	public StatusOS[] getStatusesOS() {
		return StatusOS.values();
	}

	public Date getInicio() {
		return inicio;
	}

	public void setInicio(Date inicio) {
		this.inicio = inicio;
	}

	public Date getFim() {
		return fim;
	}

	public void setFim(Date fim) {
		this.fim = fim;
	}

	public StatusOS getStatusOS() {
		return statusOS;
	}

	public void setStatusOS(StatusOS statusOS) {
		this.statusOS = statusOS;
	}

	public List<OrdemServico> getOrdensServico() {
		return ordensServico;
	}

	public void setOrdensServico(List<OrdemServico> ordensServico) {
		this.ordensServico = ordensServico;
	}

	public OrdemServicoService getOrdemServicoService() {
		return ordemServicoService;
	}

	public void setOrdemServicoService(OrdemServicoService ordemServicoService) {
		this.ordemServicoService = ordemServicoService;
	}

}